#include<stdio.h>

union Data{
    unsigned char c;
    unsigned int i;
    unsigned short s;
    char str[20];
};
//判断当前主机的网络字节序（大小端）

union Mydate{
    unsigned int date;
    struct{
        unsigned char byte0;
        unsigned char byte1;
        unsigned char byte2;
        unsigned char byte3;
    }byte;
};

//定义函数指针别名
typedef int (*funcPtr)(int ,int);
int add(const int a,const int b){
    return a+b;
}
int subtract(const int a,const int b){
    return a-b;
}
int results(funcPtr fun,int a,int b){
    int res=fun(a,b);
    return res;
}


int main(){
    union Data data;

    //联合体中，所有的变量是内存共享的
    printf("data.c的地址：%p\n",&data.c);
    printf("data.i的地址：%p\n",&data.i);
    printf("data.s的地址：%p\n",&data.s);
    printf("data.str的地址：%p\n",&data.str);
    //大小为最大变量的大小
    printf("data的内存大小:%zd\n",sizeof(data));
    //各个数据成员之间会发生
    data.i=10;
    printf("i=%d\n",data.i);
    printf("s=%d\n",data.s);

    union Mydate num;
    num.date=0x12345678;
    if(0x78==num.byte.byte0){
        printf("小端\n");
        printf("地址：%x\n",num.byte.byte0);
    }else if(0x78==num.byte.byte3){//高字节存储在低位
        printf("大端\n");
        printf("地址：%x\n",num.byte.byte3);
    }

    //回调函数：允许将一个函数作为参数传递给另一个函数，并在需要的时候被调用
    int res=results(add,1,2);
    printf("res=%d\n",res);
    res=results(subtract,3,1);
    printf("res=%d\n",res);

    return 0;
}